package com.xiaoxie.cloud.resp;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class ResultData<T> {

    // 状态码
    private String code;
    // 提示信息
    private String message;
    // 返回数据
    private T data;
    // 接口调用时间戳
    private long timestamp;

    public ResultData() {
        this.timestamp = System.currentTimeMillis();
    }

    public static ResultData success(String message) {
        return new ResultData().setCode(ReturnCodeEnum.RC200.getCode()).setMessage(message);
    }

    /**
     * 成功返回
     * @param data : 返回的数据
     * @return
     * @param <T>
     */
    public static <T> ResultData<T> success(T data) {
        ResultData<T> resultData = new ResultData<>();

        resultData.setCode(ReturnCodeEnum.RC200.getCode());
        resultData.setMessage(ReturnCodeEnum.RC200.getMessage());
        resultData.setData(data);

        return resultData;
    }

    /**
     * 成功返回，提示信息由自己定义，状诚态码取枚举中的成功状态码
     * @param message : 提示信息
     * @param data ： 返回的数据
     * @return
     * @param <T>
     */
    public static <T> ResultData<T> success(String message, T data) {
        ResultData<T> resultData = new ResultData<>();

        resultData.setCode(ReturnCodeEnum.RC200.getCode());
        resultData.setMessage(message);
        resultData.setData(data);

        return resultData;
    }


    /**
     * 失败返回
     * @param returnCodeEnum : 枚举
     * @return
     * @param <T>
     */
    public static <T> ResultData<T> fail(ReturnCodeEnum returnCodeEnum) {
        ResultData<T> resultData = new ResultData<>();

        resultData.setCode(returnCodeEnum.getCode());
        resultData.setMessage(returnCodeEnum.getMessage());

        return resultData;
    }

    /**
     * 自定义失败返回
     * @param code : 状态码
     * @param message : 提示信息
     * @return
     * @param <T>
     */
    public static <T> ResultData<T> fail(String code, String message) {
        ResultData<T> resultData = new ResultData<>();

        resultData.setCode(code);
        resultData.setMessage(message);

        return resultData;
    }

    /**
     * 带数据的失败返回
     * @param code：自定义状态码
     * @param message：自定义提示信息
     * @param data ： 返回的数据
     * @return
     * @param <T>
     */
    public static <T> ResultData<T> fail(String code, String message, T data) {
        ResultData<T> resultData = new ResultData<>();

        resultData.setCode(code);
        resultData.setMessage(message);
        resultData.setData(data);

        return resultData;
    }
}
